package  main.java.leetcode.editor.cn;
//2023-07-04 15:11:58
//栈排序。 编写程序，对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据，但不得将元素复制到别的数据结构（如数组）中。该栈支持如下操作：
//push、pop、peek 和 isEmpty。当栈为空时，peek 返回 -1。 
//
// 示例1: 
//
//  输入：
//["SortedStack", "push", "push", "peek", "pop", "peek"]
//[[], [1], [2], [], [], []]
// 输出：
//[null,null,null,1,null,2]
// 
//
// 示例2: 
//
//  输入： 
//["SortedStack", "pop", "pop", "push", "pop", "isEmpty"]
//[[], [], [], [1], [], []]
// 输出：
//[null,null,null,null,null,true]
// 
//
// 说明: 
//
// 
// 栈中的元素数目在[0, 5000]范围内。 
// 
// Related Topics 栈 设计 单调栈 👍 96 👎 0

import java.util.ArrayDeque;
import java.util.Deque;

class SortOfStacksLcci {
    public static void main(String[] args) {
        //创建该题目的对象方便调用
        SortedStack solution = new SortOfStacksLcci().new SortedStack();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class SortedStack {

    Deque<Integer> stack1;
    public SortedStack() {
        stack1 =  new ArrayDeque<>();
    }
    
    public void push(int val) {
        // 递归push
        if(isEmpty() || stack1.peekLast() >= val){
            stack1.offerLast(val);
        }else{
            // 将小于val的元素弹出
            int temp = stack1.pollLast();
            push(val);
            stack1.offerLast(temp);
        }
    }
    
    public void pop() {
        if(isEmpty()){
            return;
        }
        stack1.pollLast();
    }
    
    public int peek() {
        if(isEmpty()){
            return -1;
        }
        return stack1.peekLast();
    }
    
    public boolean isEmpty() {
        return stack1.isEmpty();
    }
}

/**
 * Your SortedStack object will be instantiated and called as such:
 * SortedStack obj = new SortedStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.isEmpty();
 */
//leetcode submit region end(Prohibit modification and deletion)

}
